﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using Core.Message.Entities;
using Core.Controls.Message;
using Core.ExceptionHandling;
using Core.Common.Session;
using vHCS.TS.Business;
using vHCS.HR.Business;
using vHCS.HR.Entities;
using vHCS.SYS.Business;
using vHCS.LS.Business;
using Telerik.Web.UI;
using vHCS.K2App.Shared;

namespace vHCS.K2App.MdlK2
{
    public partial class LeaveRequestHis : Core.NTier.UserInterface.BaseFormNotPer
    {
        /// <summary>
        /// Khai báo biến
        /// </summary>
        private const string _LIST_PAGE = "TS_LeaveListByUser.aspx";
        private const string _MY_PAGE = "TS_LeaveRequestByUser.aspx";
        private const string _APPLICATIONID = "ApplicationLeaveID";
        private const string _LEAVERECORDID = "LeaveRecordID";
        private const string _EMPID = "EmpID";
        private const long _APPROVED = 4; // đã duyệt

        /// <summary>
        /// page load
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void Page_Load(object sender, EventArgs e)
        {

            // Check user incharge to view history
            //string userAccess = SessionManager.UserDomain;
            //int Id = Convert.ToInt32(Request.QueryString["ApplicationLeaveID"].ToString());
            //HistoryComment his = new HistoryComment();
            //if (!his.CheckUserInCharge(userAccess, Id, 4)) // If user not incharge
            //{
            //    Response.Redirect("../UnAuthorize.htm");    
            //}


            dtpCurrentDate.SelectedDate = DateTime.Now.Date;
            hStatusEdit.Value = "0";
            chkDetail.Checked = false; // mặc định = false


            if (!Page.IsPostBack)
            {
                //-------------- lấy kết quả request
                // ID nhân viên
                long lngEmpID = 0;
                long.TryParse(Request.QueryString[_EMPID], out lngEmpID);
                this.hEmpID.Value = lngEmpID.ToString();
                if (hEmpID.Value != "0")
                    ucEmpHeader.LoadEmpInfoByEmpId(Convert.ToInt64(hEmpID.Value));

                // ID đơn nghỉ
                long lngApplicationID = 0;
                long.TryParse(Request.QueryString[_APPLICATIONID], out lngApplicationID);
                this.hApplicationLeaveID.Value = lngApplicationID.ToString();
                // ID phiếu nghỉ
                long lngLeaveRecordID = 0;
                long.TryParse(Request.QueryString[_LEAVERECORDID], out lngLeaveRecordID);
                this.hLeaveRecordID.Value = lngLeaveRecordID.ToString();

                hStatusEdit.Value = "1";

                LoadInfoLeaveRecord(lngLeaveRecordID);   // load chi tiet thong tin phieu nghi   
            }
        }

        /// <summary>
        /// sự kiện click nút danh sách
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void btnList_Click(object sender, EventArgs e)
        {
            this.Response.Redirect(_LIST_PAGE);
        }

        /// <summary>
        /// sự kiện click nút tạo đơn nghỉ mới
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void btnCreate_Click(object sender, EventArgs e)
        {
            this.Response.Redirect(_MY_PAGE);
        }


        /// <summary>
        /// xử lý ajax - chọn thông tin đến ngày -> hiển thị thông tin ca làm việc trong khoảng thời gian từ ngày - đến ngày xuống lưới
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void dtpToDate_OnDateSelected(object sender, Telerik.Web.UI.Calendar.SelectedDateChangedEventArgs e)
        {
            try
            {
                // ID nhân viên
                long lngEmpID = 0;
                long.TryParse(this.hEmpID.Value, out lngEmpID);

                //lấy thông tin danh sách ca làm việc trong khoảng thời gian
                TS_LeaveRecordCollection col = new TS_LeaveRecordCollection();
                DataTable dt = new DataTable();
                // ID phiếu nghỉ
                long lngLeaveID = 0;
                long.TryParse(hLeaveRecordID.Value.ToString(), out lngLeaveID);
                // ID loại nghỉ
                long lngWorkPointID = 0;
                long.TryParse(cboWorkPoint.SelectedValue, out lngWorkPointID);

                if (dtpToDate.SelectedDate == null && txtWorkPointTypeID.Text == "5") // đối với nhóm loại nghỉ sinh con
                    dtpToDate.SelectedDate = Convert.ToDateTime("01/01/2999");
                else if (dtpFromDate.SelectedDate == null || dtpToDate.SelectedDate == null) // 1 trong 2 thong tin = null thi ko lam j het
                    return;

                if (dtpFromDate.SelectedDate != null && dtpToDate.SelectedDate != null && Convert.ToDateTime(dtpFromDate.SelectedDate) <= Convert.ToDateTime(dtpToDate.SelectedDate))
                {
                    dt = col.SearchDetailScheduleEmp(lngEmpID, dtpFromDate.SelectedDate.Value, dtpToDate.SelectedDate.Value, lngLeaveID, hStatusEdit.Value.ToString(), lngWorkPointID);

                    // duyệt để tính số ngày làm việc theo lịch
                    float sumCoef = 0;
                    string WorkPointTypeCode = "";
                    DateTime date = new DateTime();
                    foreach (DataRow r in dt.Rows)
                    {
                        sumCoef += float.Parse(r["NumDay"].ToString());
                        WorkPointTypeCode = r["WorkPointTypeCode"].ToString();
                        date = Convert.ToDateTime(r["ToDate"]);
                    }
                    txtLeaveTaken.Text = sumCoef.ToString(); // duyệt xong thì gán vào số ngày nghỉ

                    // load thông tin đến ngày trong trường hợp nghỉ thai sản
                    if (WorkPointTypeCode == "0001") // nhóm loại nghỉ sinh con
                        dtpToDate.SelectedDate = date;

                    // load chi tiết phiếu nghỉ
                    LoadDetailGrid();

                    // khoảng thời gian ko có ca làm việc
                    if (dtgDetail.Items.Count <= 0)
                        MessageBox.ShowByMessCode("10160", MessageType.Warning);
                    else
                    {
                        float SoNgayNghiNhap = TS_clsCommon.ConvertFromStringToFloat(txtLeaveTaken.Text);
                        float SoNgayNghiDB = TS_clsCommon.ConvertFromStringToFloat(txtLeaveTemp.Text);
                        float PhepCoTT = TS_clsCommon.ConvertFromStringToFloat(txtYearsDayActual.Text);
                        if (txtWorkPointTypeID.Text != "5")
                        {   // đối với nhóm nghỉ sinh con (thai sản) thì ko cần kiểm tra
                            if (SoNgayNghiNhap > PhepCoTT + SoNgayNghiDB && txtYearsDayActual.Text != "")
                                pnlValidate.Visible = true;
                            else
                                pnlValidate.Visible = false;
                        }
                        else pnlValidate.Visible = false;
                    }
                }
            }
            catch (Exception ex)
            {
                AlertMessage mess = UserInterfaceExceptionHandler.HandleExcetion(ex);
                MessageBox.Show(mess);
            }
        }

        /// <summary>
        /// xử lý ajax chọn loại nghỉ -> tính số ngày nghỉ còn lại và hiển thị phần lưu ý
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void cboWorkPoint_SelectedIndexChanged(object sender, Telerik.Web.UI.RadComboBoxSelectedIndexChangedEventArgs e)
        {
            try
            {
                // clear thông tin trước khi load lại
                txtRemainLeave.Text = string.Empty;

                // ID nhân viên
                long lngEmpID = 0;
                long.TryParse(this.hEmpID.Value, out lngEmpID);

                // ID loại nghỉ
                long lngWorkPointID = 0;
                long.TryParse(this.cboWorkPoint.SelectedValue, out lngWorkPointID);

                // lấy thông tin số ngày còn lại tương ứng của nhân viên và loại nghỉ
                TS_LeaveRecordCollection col = new TS_LeaveRecordCollection();
                DataTable dt = new DataTable();
                dt = col.FindWorkPointByID_NewRule(lngWorkPointID, lngEmpID);

                if (dt != null && dt.Rows.Count > 0)
                {
                    DataRow r = dt.Rows[0];

                    // load số ngày còn lại, comment
                    if (r["LSWorkPointTypeID"].ToString() != "5")
                    { // đối với nhóm loại nghỉ thai sản thì ko thể hiện số ngày còn lại                    
                        txtRemainLeave.Text = r["YearDays"].ToString(); // còn lại                    
                        txtYearsDay.Text = r["SoPhepCo"].ToString(); // số phép có      
                        txtLeaveDay.Text = r["DaNghi"].ToString(); // đã nghỉ
                        txtYearsDayActual.Text = r["SoPhepTT"].ToString(); // số ngày được nghỉ thực tế
                        txtLeaveTemp.Text = "0";
                    }
                    txtComment.Text = r["Note"].ToString();

                    if (Convert.ToBoolean(r["IsConfirm"].ToString())) // nếu là loại nghỉ có xác nhận thì hiển thị ghi chú
                        pnlComment.Visible = true;
                    else
                        pnlComment.Visible = false;

                    // lấy thông tin nhóm loại nghỉ tương ứng
                    txtWorkPointTypeID.Text = r["LSWorkPointTypeID"].ToString();

                    txtCLDays.Text = r["YearDays"].ToString();
                }

                // rem [19/09/2011]
                /*// lấy thông tin số ngày còn lại tương ứng của nhân viên và loại nghỉ
                TS_LeaveRecordCollection col = new TS_LeaveRecordCollection();
                LS_WorkPointBL bl = new LS_WorkPointBL();
                bl = col.FindWorkPointByID(lngWorkPointID, lngEmpID);

                // load số ngày còn lại, comment
                if (bl.LSWorkPointTypeID != 5) // đối với nhóm loại nghỉ thai sản thì ko thể hiện số ngày còn lại
                    txtRemainLeave.Text = bl.YearDays.ToString();
                txtComment.Text = bl.Note;

                if (bl.IsConfirm) // nếu là loại nghỉ có xác nhận thì hiển thị ghi chú
                    pnlComment.Visible = true;
                else
                    pnlComment.Visible = false;

                // lấy thông tin nhóm loại nghỉ tương ứng
                txtWorkPointTypeID.Text = bl.LSWorkPointTypeID.ToString();

                txtCLDays.Text = bl.YearDays.ToString();
                */
            }
            catch (Exception ex)
            {
                AlertMessage mess = UserInterfaceExceptionHandler.HandleExcetion(ex);
                MessageBox.Show(mess);
            }
        }

        /// <summary>
        /// Write dữ liệu cho lưới chi tiết phiếu nghỉ
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void dtgDetail_ItemDataBound(object sender, Telerik.Web.UI.GridItemEventArgs e)
        {
            try
            {
                string IsHalfDay = "", IsHead = "", IsLast = "", IsAll = "";
                string IsHeadE = "", IsLastE = "", IsAllE = "";
                foreach (GridDataItem item in dtgDetail.Items)
                {
                    IsHalfDay = item["IsHalfDay"].Text.ToString();
                    IsHead = item["IsHead"].Text.ToString();
                    IsLast = item["IsLast"].Text.ToString();
                    IsAll = item["IsAll"].Text.ToString();
                    IsHeadE = item["IsHeadE"].Text.ToString();
                    IsLastE = item["IsLastE"].Text.ToString();
                    IsAllE = item["IsAllE"].Text.ToString();

                    CheckBox chkAll = (CheckBox)item.FindControl("chkAll");
                    CheckBox chkHead = (CheckBox)item.FindControl("chkHead");
                    CheckBox chkLast = (CheckBox)item.FindControl("chkLast");

                    //// xử lý visible trong trường hợp ca 1/2 ngày hoặc 1 ngày có 2 loại nghỉ (đã nhập nửa buổi trong hệ thống)
                    //if (IsHalfDay == "1") // ca 1/2 ngày
                    //{
                    //    chkAll.Enabled = false;
                    //    chkLast.Enabled = false;
                    //    chkHead.Enabled = true;
                    //}
                    //else // ca nguyên ngày
                    //{
                    //    chkAll.Enabled = true;
                    //    chkLast.Enabled = true;
                    //    chkHead.Enabled = true;
                    //}
                    //if (IsAllE == "1" || (IsHalfDay == "1" && IsHeadE == "1")) // ngày đã nhập nghỉ ở 1 phiếu nghỉ khác
                    //{
                    //    chkAll.Enabled = false;
                    //    chkLast.Enabled = false;
                    //    chkHead.Enabled = false;
                    //}
                    //else if (IsHeadE == "1")
                    //{
                    //    chkAll.Enabled = false;
                    //    chkLast.Enabled = true;
                    //    chkHead.Enabled = false;
                    //}
                    //else if (IsLastE == "1")
                    //{
                    //    chkAll.Enabled = false;
                    //    chkLast.Enabled = false;
                    //    chkHead.Enabled = true;
                    //}


                    // xử lý tự động check
                    if (IsHead == "1") chkHead.Checked = true;
                    if (IsLast == "1") chkLast.Checked = true;
                    if (IsAll == "1") chkAll.Checked = true;

                    //// nếu là nghỉ thai sản thì ko cho hiệu chỉnh thông tin chi tiết phiếu nghỉ
                    //if (txtWorkPointTypeID.Text == "5") // nhóm nghỉ sinh con
                    //{
                    //    chkAll.Enabled = false;
                    //    chkLast.Enabled = false;
                    //    chkHead.Enabled = false;
                    //}
                }
            }
            catch (Exception ex)
            {
                AlertMessage mess = UserInterfaceExceptionHandler.HandleExcetion(ex);
                MessageBox.Show(mess);
            }
        }

        /// <summary>
        /// edit thông tin phiếu nghỉ
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void dtgList_ItemCommand(object sender, Telerik.Web.UI.GridCommandEventArgs e)
        {
            try
            {
                if (e.CommandName == "EditLeave")
                {
                    long lngLeaveRecordID = 0;
                    GridDataItem item = (GridDataItem)e.Item;
                    long.TryParse(item["LeaveRecordID"].Text, out lngLeaveRecordID);
                    hStatusEdit.Value = "1";
                    LoadInfoLeaveRecord(lngLeaveRecordID);
                }
            }
            catch (Exception ex)
            {
                AlertMessage mess = UserInterfaceExceptionHandler.HandleExcetion(ex);
                MessageBox.Show(mess);
            }
        }

        /// <summary>
        /// Sự kiện bind dữ liệu khi load Form cho dtgList
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void dtgList_ItemDataBound(object sender, Telerik.Web.UI.GridItemEventArgs e)
        {
            try
            {
                String isdeleted = "";
                if (e.Item is GridDataItem)
                {
                    GridDataItem item = (GridDataItem)e.Item;

                    isdeleted = item["IsDeleted"].Text.ToString();
                    CheckBox check = (item["ClientSelectColumn"].Controls[0] as CheckBox);

                    // được xóa những dòng chưa có hiệu lực
                    if (isdeleted == "1")
                    {
                        check.Visible = true;
                    }
                    else
                    {
                        check.Visible = false;
                    }
                }
            }
            catch (Exception ex)
            {
                AlertMessage mess = UserInterfaceExceptionHandler.HandleExcetion(ex);
                MessageBox.Show(mess);
            }
        }


        /// <summary>
        /// Load thông tin chi tiết phiếu nghỉ
        /// </summary>
        /// <param name="LeaveRecordID"></param>
        protected void LoadInfoLeaveRecord(long LeaveRecordID)
        {
            try
            {
                TS_LeaveRecordBL bl = new TS_LeaveRecordBL();
                TS_LeaveRecordCollection col = new TS_LeaveRecordCollection();

                // lay thong tin chi tiet phieu nghi theo ID
                bl = col.FindLeaveRecordByID(LeaveRecordID);

                // thông tin loại nghỉ theo nhân viên
                long lngEmpID = 0;
                long.TryParse(hEmpID.Value, out lngEmpID);
                LS_WorkPointCollection col1 = new LS_WorkPointCollection();
                DataTable dtWorkPoint = new DataTable();
                dtWorkPoint = col1.GetComboWorkPointByEmpIDCheck(lngEmpID);

                if (bl.DTO != null)
                {
                    this.chkDetail.Checked = true;

                    for (int i = 0; i < dtWorkPoint.Rows.Count; i++)
                        if (dtWorkPoint.Rows[i]["Id"].ToString() == bl.LSWorkPointID.ToString())
                            this.cboWorkPoint.SelectedValue = bl.LSWorkPointID.ToString();

                    this.dtpFromDate.SelectedDate = bl.FromDate;
                    this.dtpToDate.SelectedDate = bl.ToDate;
                    this.txtLeaveTaken.Text = bl.LeaveTaken;
                    this.txtReason.Text = bl.Note;
                    this.txtComment.Text = bl.Comment;
                    this.hEmpID.Value = bl.EmpID.ToString();
                    this.hLeaveRecordID.Value = bl.LeaveRecordID.ToString();
                    this.hApplicationLeaveID.Value = bl.ApplicationLeaveID.ToString();
                    txtNoteUpdate.Text = bl.NoteUpdate;


                    DataTable dt = col.GetUnUsedDays(bl.EmpID, bl.FromDate, bl.ToDate, bl.LSWorkPointID, LeaveRecordID);
                    DataRow r = dt.Rows[0];
                    txtRemainLeave.Text = r["UnUsedDays"].ToString();
                    txtWorkPointTypeID.Text = r["WorkPointTypeID"].ToString();
                    txtYearsDay.Text = r["PhepCo"].ToString(); // số ngày có
                    txtYearsDayActual.Text = r["PhepCoTT"].ToString(); // số ngày có thực tế
                    txtLeaveDay.Text = r["DaNghi"].ToString(); // số ngày đã nghỉ
                    txtLeaveTemp.Text = txtLeaveTaken.Text;

                    if (r["IsConfirm"].ToString() == "1")
                        pnlComment.Visible = true;
                    else
                        pnlComment.Visible = false;

                }
            }
            catch (Exception ex)
            {
                AlertMessage mess = UserInterfaceExceptionHandler.HandleExcetion(ex);
                MessageBox.Show(mess);
            }
        }

        /// <summary>
        /// load thông tin chi tiết phiếu nghỉ
        /// </summary>
        protected void LoadDetailGrid()
        {
            this.dataDetail.SelectParameters["FromDate"].DefaultValue = dtpFromDate.SelectedDate.ToString();
            this.dataDetail.SelectParameters["ToDate"].DefaultValue = dtpToDate.SelectedDate.ToString();
            this.dataDetail.SelectParameters["EmpID"].DefaultValue = hEmpID.Value;
            this.dataDetail.SelectParameters["LeaveRecordID"].DefaultValue = hLeaveRecordID.Value;
            this.dataDetail.SelectParameters["StatusEdit"].DefaultValue = hStatusEdit.Value;

            this.dtgDetail.DataSourceID = dataDetail.ID;
            this.dtgDetail.DataBind();
        }

        /// <summary>
        /// load thông tin danh sách phiếu nghỉ
        /// </summary>
        protected void LoadLeaveListGrid()
        {
            this.dataList.SelectParameters["ApplicationID"].DefaultValue = hApplicationLeaveID.Value;

            this.dtgList.DataSourceID = dataList.ID;
            this.dtgList.DataBind();
        }

        
    }
}